﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using DupeKill.Core; 
using DupeKill.Core.IO;
using DupeKill.Core.Comparison;
using DupeKill.Core.Discovery;

using DupeKill.UnitTests.Helpers; 

namespace DupeKill.UnitTests.Comparison
{
    /// <summary>
    /// Zusammenfassungsbeschreibung für Test_ByContent_FileSetComparer
    /// </summary>
    [TestClass]
    public class Test_ByContent_FileSetComparer
    {
        public Test_ByContent_FileSetComparer()
        {
            //
            // TODO: Konstruktorlogik hier hinzufügen
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Ruft den Textkontext mit Informationen über
        ///den aktuellen Testlauf sowie Funktionalität für diesen auf oder legt diese fest.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Zusätzliche Testattribute
        //
        // Sie können beim Schreiben der Tests folgende zusätzliche Attribute verwenden:
        //
        // Verwenden Sie ClassInitialize, um vor Ausführung des ersten Tests in der Klasse Code auszuführen.
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Verwenden Sie ClassCleanup, um nach Ausführung aller Tests in einer Klasse Code auszuführen.
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Mit TestInitialize können Sie vor jedem einzelnen Test Code ausführen. 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Mit TestCleanup können Sie nach jedem einzelnen Test Code ausführen.
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        
        [TestMethod]
        public void Test_Single_FileSet()
        {
            string [] fileNames = {"0.001"}; 
            string [] contents = {"a"};

            List<FileSet> compared = CreateFileSets(fileNames, contents); 
            Assert.AreEqual(1, compared.Count);
            Assert.AreEqual(1, compared[0].Count); 
        }

        [TestMethod]
        public void Test_Two_FileSets_Of_Length_1_Which_Are_Equal()
        {
            string[] fileNames = { "0.001", "0.002" };
            string[] contents =  { "a","a" };

            List<FileSet> compared = CreateFileSets(fileNames, contents);
            Assert.AreEqual(1, compared.Count);
            Assert.AreEqual(2, compared[0].Count);
        }

        [TestMethod]
        public void Test_Two_FileSets_Of_Length_1_Which_Are_Not_Equal()
        {
            string[] fileNames = { "0.001", "0.002" };
            string[] contents = { "a", "b" };

            List<FileSet> compared = CreateFileSets(fileNames, contents);
            Assert.AreEqual(2, compared.Count);
            Assert.AreEqual(1, compared[0].Count);
            Assert.AreEqual(1, compared[1].Count);
        }

        [TestMethod]
        public void Test_Three_FileSets_Of_Length_2_Of_Which_Two_Are_Equal()
        {
            string[] fileNames = { "0.001", "0.002", "0.003" };
            string[] contents = { "aa", "ab", "ab" };

            List<FileSet> compared = CreateFileSets(fileNames, contents);
            Assert.AreEqual(2, compared.Count);
            Assert.AreEqual(1, compared[0].Count);
            Assert.AreEqual(2, compared[1].Count);
        }

        private List<FileSet> CreateFileSets(string[] fileNames, string[] contents)
        {
            TestCaseFileSystemGateway fileSystem = TestCaseFileSystemGateway.Create(fileNames, contents); 
            FileSet fileSet = new FileSet();
            new FileSetLoader(fileSet).LoadAll(fileSystem.CreateIterator());

            FileSetComparerFactory fscf = new FileSetComparerFactory(fileSystem);

            IFileSetComparer comparer = fscf.CreateByContentComparer(1);

            return new List<FileSet>(comparer.CompareAndSplit(fileSet));
        }
    }
}
